import openpyxl


class ExcelUtils:

    @staticmethod
    def read_excel_to_array(file_path, sheet_name):

        # 打开Excel文件
        wb = openpyxl.load_workbook(file_path)
        # 获取工作表
        sheet = wb[sheet_name]
        # 获取最大行数和最大列数
        max_row = sheet.max_row
        max_column = sheet.max_column
        # 创建一个二维数组来存储Excel数据
        return [[sheet.cell(row=i, column=j).value for j in range(1, max_column + 1)] for i in range(2, max_row + 1)]

    @staticmethod
    def read_excel_toarray_dict(file_path, sheet_name, key_array):
        """
        读取Excel文件，并将其转换为二维数组，其中每个元素是一个字典
        :param sheet_name: 工作表名
        :param file_path: 文件路径
        :param key_array: excel表头名数组
        :return:
        """

        # 打开Excel文件
        wb = openpyxl.load_workbook(file_path)
        # 获取工作表
        sheet = wb[sheet_name]
        # 获取最大行数和最大列数
        max_row = sheet.max_row
        max_column = sheet.max_column
        # 创建一个二维数组来存储Excel数据
        result = []

        # 遍历每一行数据
        for i in range(2, max_row + 1):
            # 创建一个字典来存储每一行数据
            row_data = {}

            # 遍历每一列数据
            for j in range(1, max_column + 1):
                # 获取单元格的值
                cell_value = sheet.cell(row=i, column=j).value
                # 将单元格的值存储到字典中，键为表头名
                row_data[key_array[j - 1]] = cell_value

            # 将字典添加到结果数组中
            result.append(row_data)

        return result

    @staticmethod
    def write_excel_by_array_dict(file_path, data_array, sheet_name):
        """
        将数据写入Excel文件，覆盖原有数据
        :param file_path: 文件路径
        :param data_array: 二维数组，每个元素是一个字典，字典的键为表头名
        :return:
        """

        # 打开Excel文件
        wb = openpyxl.load_workbook(file_path)
        # 获取工作表
        sheet = wb[sheet_name]
        # 字典的键为表头名写在第一行
        key_array = list(data_array[0].keys())
        # 写入表头
        for i, key in enumerate(key_array):
            sheet.cell(row=1, column=i + 1, value=key)

        # 遍历每一行数据
        for i, row_data in enumerate(data_array):
            # 遍历每一列数据
            for j, key in enumerate(key_array):
                # 写入单元格的值
                sheet.cell(row=i + 2, column=j + 1, value=row_data[key])

        # 保存Excel文件
        wb.save(file_path)


